iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0

Inter-process communication (行程間通訊)

通俗的講 IPC 就是程式和程式之間能夠溝通,最常見的例子就是瀏覽器與 Web 伺服器,瀏覽器作為一個程式,向遠在天邊的 Web 伺服器拿取資料。這邊舉一些 IPC 的例子:

用螢幕截圖軟體截圖儲存成圖檔後用其他軟體開啟→檔案;
玩線上遊戲→Socket;
D-Bus、Pipe 等等都是 IPC 的一種。

資料的生產者與消費者

資料的生產者與消費者這樣的模式在軟體工程中十分常見:
顯卡算圖,演算法就是生產者,螢幕就是消費者;
對 Web 而言,使用者既是生產者(request 的生產者)也是消費者(response 的消費者);
在 ReactiveX 中,事件流的起點就是生產者,事件流的終點就是消費者;
廣義來講 CI/CD 中的 repo 就是生產者,deploy 就是消費者。

說白了,不少軟體就是做著轉換的工作,
把 javascript 轉換成 javascript bundle,
把 sass 轉換成 css,
把 javascript 轉換成 HTML DOM,
把原始碼轉成二進制執行檔,
把 event 轉換成 request,
把 request 轉換成 response,
把 response 轉換成 View...

因為轉換這個行為有輸入、有輸出,理所當然的我們可以像人形蜈蚣一樣,把輸出再倒給另外一個程式的輸入。

stdin, stdout 與 stderr

Unix 的 Standard streams 分別包含了標準輸入 (stdin)、標準輸出 (stdout) 和標準錯誤輸出 (stderr)。

可以把程式想像成有一個輸入的界面 (stdin) 和兩個輸出的界面 (stdout, stderr)。

對於有寫過 C++ 的朋友們,想必對 std:cinstd:cout 不會太陌生吧?

#include <iostream>  
using namespace std;  
int main( ) {  
  int age;  
   cout << "Enter your age: ";  
   cin >> age;  
   cout << "Your age is: " << age << endl;  
}  

沒錯,它們就是對應了 stdin 和 stdout。

Pipe

Pipe 是一種 IPC,有操作過 Linux 的朋友應該使用過類似這樣的指令吧?

ls | grep something

這就是一個使用了 pipe 的例子:ls 指令的輸出會倒給 grep,而且這個 pipe 就像人型蜈蚣一樣,可以一直串連接下去。

這裡簡單展示一個比較複雜的 pipe 使用例子:

cat *.png | \
ffmpeg -hide_banner \
-y \
-framerate 20 \
-f png_pipe \
-i pipe:0 \
-c:v libx264 \
-pix_fmt rgb24 \
-r 20 \
-crf 0 \
-f nut \
pipe:1 |
mpv -

這串指令做的事情是這樣的,cat -> ffmpeg -> mpv

  1. cat 把讀取圖片並把資料流送到 stdout
  2. ffmpegstdpin 擷取 png 資料並轉換成影片後送到 stdout
  3. mpvstding 獲取影像串流後播放到播放器上

上一篇
Day 11 Express 簡介
下一篇
Day 13 Socket.io 簡介
系列文
關於用 Javascript (Typescript) Stack 打造某種 Backend 3D Rendering 的東東這檔事23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言